//
// Created by sanfen on 2021/3/9.
//

#ifndef CHIP8_SIMULATOR_MONITOR64X32_H
#define CHIP8_SIMULATOR_MONITOR64X32_H

#include <sys/time.h>
#include <iostream>
#include <QtWidgets>
#include <QMainWindow>
#include <QtCore>
#include <QTimer>
#include <chip8.h>
#include "Monitor64x32GL.h"
#include "ui_mainwindow.h"

namespace Ui{
    class Monitor64x32;
}

class Monitor64x32 : public QMainWindow{
    Q_OBJECT            //申请一个QT对象
public:
    struct timeval clock_prev;   //timeval 同步 时间计算获得时间延迟
    Monitor64x32(QWidget * parent=0);
    void link_cpu(CHIP8 &chip8);
    int keymap(unsigned char k);

    void keyPressEvent(QKeyEvent *event);

    int timediff_ms(struct timeval *end,struct timeval *start);  //该函数用于计算延迟时间

    void keyReleaseEvent(QKeyEvent *event);

    ~Monitor64x32();

private slots:
    /*信号插槽函数:当timeout()被执行以后timeout_sc()收到信号
     * 事件驱动：事件驱动是指在持续事务管理过程中，进行决策的一种策略，即跟随当前时间点上出现的事件，
     *          调动可用资源，执行相关任务，使不断出现的问题得以解决，防止事务堆积。
     *  就相当于对事件进行调度，但是按照先来后到的顺序进行调度
     */
        void paint_screen();

        void timeout_sc();
    //信号函数
    signals:
        void draw_pixel(int row,int col,float color);
        void repaint_screen();

private:
    CHIP8 cpu;
    Monitor64x32GL *glwindow;
    void paint_pixel(int row,int col,unsigned char color);
    void paint_cell(int row,int col,unsigned char color);

};


#endif //CHIP8_SIMULATOR_MONITOR64X32_H
